from app.models import PlanConfig, Student
from app.extensions import db

class PlanConfigService:
    """智能计划配置服务"""

    @staticmethod
    def create_default_config(student_id: int) -> PlanConfig:
        """创建默认学习计划配置"""
        default_config = PlanConfig(
            daily_new=5,
            daily_review=5,
            max_repeat=5,
            student_id=student_id
        )
        db.session.add(default_config)
        db.session.commit()
        return default_config

    @staticmethod
    def get_config(user_id):
        """获取学习计划配置"""
        try:
            print('当前用户id',user_id)
            # 查询关联的学生
            students = Student.query.filter_by(parent_id=user_id).all()
            if not students:
                return {'code': 404, 'msg': '未找到该用户的学生信息'}
            
            # 提取学生 ID
            student_ids = [student.student_id for student in students]

            # 查询学习计划配置
            configs = PlanConfig.query.filter(PlanConfig.student_id.in_(student_ids)).all()

            # 构建返回数据
            result = {
                'code': 200,
                'msg': '获取成功',
                'data': []
            }

            # 将学生姓名添加到配置数据中
            for config in configs:
                # 找到对应的学生
                student = next((s for s in students if s.student_id == config.student_id), None)
                if student:
                    config_dict = config.to_dict()
                    config_dict['student_name'] = student.name  # 添加学生姓名
                    result['data'].append(config_dict)

            return result

        except Exception as e:
            # 捕获异常并返回错误信息
            return {'code': 500, 'msg': f'获取学习计划配置失败: {str(e)}'}

    @staticmethod
    def delete_config(config_id):
        """删除学习计划配置"""
        try:
            # 查询要删除的配置
            config = PlanConfig.query.get(config_id)
            if not config:
                return {'code': 404, 'msg': '未找到该配置'}
            # 查询该学生的所有配置记录
            student_configs = PlanConfig.query.filter_by(student_id=config.student_id).all()

            # 如果只剩最后一条记录，则禁止删除
            if len(student_configs) <= 1:
                return {'code': 400, 'msg': '该学生仅剩最后一条配置，禁止删除'}

            # 执行删除
            db.session.delete(config)
            db.session.commit()
            return {'code': 200, 'msg': '配置已删除'}
        except Exception as e:
            db.session.rollback()
            return {'code': 500, 'msg': f'删除学习计划配置失败: {str(e)}'}


    @staticmethod
    def update_config(config_id, **kwargs):
        """更新学习计划配置"""
        try:
            # 查询配置
            config = PlanConfig.query.get(config_id)
            if not config:
                return {'code': 404, 'msg': '未找到该配置'}
            
            # 更新配置
            for key, value in kwargs.items():
                setattr(config, key, value)
            
            db.session.commit()
            return {'code': 200, 'msg':'配置已更新'}
        
        except Exception as e:
            # 捕获异常并返回错误信息
            return {'code': 500, 'msg': f'更新学习计划配置失败: {str(e)}'}
            
